#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>



void worker(int number)
{
   // int* p = NULL;
    int cnt = 10;
    while(cnt)
    {
        printf("I am child, pid : %d, ppid : %d, cnt:%d, number:%d\n", getpid(), getppid(), cnt--, number);
        sleep(1);
      //  *p = 100;
    }
    //int a = 10;
    //a /= 0;
}

const int n = 10;
int main()
{
    int status = 0;
    for(int i = 0; i < n; i++)
    {
        pid_t id = fork();
        if(id == 0)
        {
            //child
            worker(i);
            exit(i);
        }
    }

    for(int i = 0; i < 10; i++)
    {
        pid_t rid = waitpid(-1, &status, 0);
        printf("parent normal exit, exit code:%d, pid:%d, rid:%d\n", WEXITSTATUS(status), getpid(), rid);
    }


    //pid_t id = fork();
    //int status = 0;
    //if(id == 0)
    //{
    //    //child
    //    worker();
    //    exit(12);
    //}
    //else{
    //    //parent
    //   // sleep(10);
    //   //printf("wait before\n");
    //   printf("wait before\n");
    //   pid_t rid = waitpid(id, &status, 0);
    //   if(id == rid)
    //   {
    //       //printf("wait sucess, pid:%d,rid:%d exit code : %d, code sig: %d\n",getpid(), rid, (status>>8)&0xFF, (status)&0x7f);
    //       if(WIFEXITED(status))
    //       {
    //           printf("child process normal exit, exit ocde:%d\n", WEXITSTATUS(status));
    //       }
    //       else{
    //           printf("child process exit expect\n");
    //       }
    //   }
    //   printf("wait before\n");
    //    printf("recycle sucess!\n");
    //}
    //return 0;
}





//void worker()
//{
//    int cnt = 5;
//    while(cnt)
//    {
//        printf("call worker function done, cnt: %d\n", cnt--); 
//    }
//    //exit(11);
//    //_exit(11);
//}
//
//
//
//
//int main()
//{
//    worker();
//    //exit(1);
//    printf("I am a process");
//    _exit(31);
//    return 0;
//}
//

//const char*  str_error[] = {
//   "Sucess",
//   "operation failed",
//   "other errno"
//};
//
//int main()
//{
//    while(1)
//    {
//        printf("I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
//        sleep(1);
//    }
//    return 0;
//
//    //int ret = 0;
//    //printf("error before: %d, strerror:%s\n", errno, strerror(errno));
//    //FILE* fp = fopen("./log.txt", "r");
//    //if(fp == NULL)
//    //{
//    //   ret = errno; 
//    //    printf("errno after: %d, strerror: %s\n", errno, str_error[errno]);
//    //}
//
//    ////int a = 100;
//    ////a /= 0;
//    //int* p = NULL;
//    //*p = 10;
//    //return ret;
//    ////for(int i = 0; i < 200; i++)
//    ////{
//    ////    printf("%d, strerror:%s\n", i, strerror(i));
//    ////}
//    ////return 11;
//}
